use std::sync::mpsc::SyncSender;

use glam::DVec3;

use crate::*;

pub fn demo3(tx: SyncSender<(usize, DVec3)>) -> (Renderer, Box<dyn Hitable>) {
    let mut scene = Hitables::default();

    let left_red = LambertMaterial::new(dvec3(1.0, 0.2, 0.2));
    let left_blue = LambertMaterial::new(dvec3(0.2, 0.2, 1.0));
    let back_green = LambertMaterial::new(dvec3(0.2, 1.0, 0.2));
    let upper_orange = LambertMaterial::new(dvec3(1.0, 0.5, 0.0));
    let lower_teal = LambertMaterial::new(dvec3(0.2, 0.8, 0.8));

    scene.add(Quad::new(
        dvec3(-3.0, -2.0,  5.0),
        dvec3( 0.0,  0.0, -4.0),
        dvec3( 0.0,  4.0,  0.0),
        left_red,
    ));
    scene.add(Quad::new(
        dvec3(-2.0, -2.0,  0.0),
        dvec3( 4.0,  0.0,  0.0),
        dvec3( 0.0,  4.0,  0.0),
        back_green,
    ));
    scene.add(Quad::new(
        dvec3( 3.0, -2.0,  1.0),
        dvec3( 0.0,  0.0,  4.0),
        dvec3( 0.0,  4.0,  0.0),
        left_blue,
    ));
    scene.add(Quad::new(
        dvec3(-2.0,  3.0,  1.0),
        dvec3( 4.0,  0.0,  0.0),
        dvec3( 0.0,  0.0,  4.0),
        upper_orange,
    ));
    scene.add(Quad::new(
        dvec3(-2.0, -3.0,  5.0),
        dvec3( 4.0,  0.0,  0.0),
        dvec3( 0.0,  0.0, -4.0),
        lower_teal,
    ));

    let renderer = RendererBuilder::new(tx)
        .camera(
            dvec3(0.0, 0.0, 9.0),
            dvec3(0.0, 0.0, 0.0),
            dvec3(0.0, 1.0, 0.0),
            80.0,
        )
        .max_depth(10)
        .sample_count(10)
        .build();

    (renderer, Box::new(BVHNode::from(scene)))
}
